package com.tools
{
	
	import flash.geom.Point;
	import flash.globalization.DateTimeFormatter;
	import flash.utils.ByteArray;

	public class ToolsBag
	{
		public static var _smalltools:ToolsBag=null;
		private var keyWordValue:Array=[];
		/**
		 *功能集合：
		 * @param 1、ceiling：返回参数b的倍数c，且是c大于参数a的最小值 
		 * @param 2、compareNum：判断参数a是否大于等于参数b
		 * @param 3、keepTwoNum：保留两位小数
		 * @param 4、checkKeyWord：判断是否有敏感字符
		 * @param 5、timeConversion：将UTC格式时间转换为指定格式，如：将123456转换成2012-01-02 12:00:00
		 * @param 6、getDateTime：获取当前系统时间
		 * @param 7、timeTranslate：将秒转换为 hh:mm:ss，可配置单位符号
		 * @param 7.1、time2Arr：将秒转换为[天，时，分，秒]数值数组
		 * @param 8、isOdd：判断参数a是否为奇数
		 * @param 9、checkContains：判断参数a是否在某个范围，如checkContains(5,"0-6")返回true
		 * @param 10、equalArr：判断两个数组的元素及顺序是否相等
		 * @param 11、inArray：判断参数a是否是数组中的一个元素
		 * @param 12、copyArray：复制数组，传入数组返回新的相等的数组
		 * @param 13、stringToArray：将字符串转换为数组
		 * @param 14、getBitValue：位运算取值
		 */		
		public function ToolsBag()
		{
		}
		public static function getThis():ToolsBag{
			if(_smalltools==null){
				_smalltools=new ToolsBag();
			}
			return _smalltools;
		}
		/**
		 * 对A取一个数字， 取到的数字为b的倍数
		 * @param a
		 * @param b
		 * @return 
		 * 
		 */		
		public static function ceiling(a:Number,b:Number):Number{
			var i:uint = 1;
			var return_value:Number = b ;
			
			while(a > return_value ){
				return_value = b * i ;
				i++;
			}
			return return_value ;
		}
		/**
		 *判断a是否大于等于b 
		 * @param a
		 * @param b
		 * @return 
		 * 
		 */		
		public static function compareNum(a:int,b:int):Boolean{
			if(a>=b){
				return true;
			}
			return false;
		}
		/**
		 *保留两位小数 
		 * @param i
		 * @return 
		 * 
		 */		
		public static function keepTwoNum(i:Number):Number{
			return Math.round(i*100)/100;
		}
		/**
		 *判断是否有敏感字符 
		 * @param s
		 * @return 
		 * 
		 */	
		public function checkKeyWord(str:String):Boolean{
			for each(var j:* in keyWordValue){
				if(str.indexOf(j)!=-1){
					return true;
				}else{
					if(j.indexOf("*")!=-1){
						if(checkText(str,j)){
							return true;
						}
					}
				}
			}
			return false;
		}
		private function checkText(s:String,key:String):Boolean{
			var arr:Array=key.split('*');
			var res:int=0;
			for each(var k:* in arr){
				if(s.indexOf(k)!=-1){
					res++;
				}
			}
			if(res==arr.length){
				return true;
			}else{
				return false;
			}
		}
		
		public static function filterChatWord(str:String):String{
			while(str.toLocaleLowerCase().search("<")>-1||str.toLocaleLowerCase().search(">")>-1){
				str=str.replace("<","＜");
				str=str.replace(">","＞");
			}
			return str;
		}
		public static var data:Date=new Date();
		public static var fm:DateTimeFormatter = new DateTimeFormatter("zh-CN");
		/**
		 *UTC时间转换为YY-MM-DD，主要用于服务端返回时间格式转换 
		 * @param t 原时间格式，如：1343298615
		 * @param type 返回的类别
		 * @return 
		 * 
		 */	
		public static function timeConversion(t:Number,type:String="yyyy-MM-dd HH:mm:ss"):String{
			fm.setDateTimePattern(type);
			data.setTime(t*1000);
			return fm.format(data);
		}
		/**
		 *获取当前时间 
		 * @param type
		 * @return 
		 * 
		 */		
		public static function getDateTime(type:String="yyyy-MM-dd HH:mm:ss"):String{
			fm.setDateTimePattern(type);
			var da:Date=new Date();
			return fm.format(da);
		}
		
		/**
		 *秒转化H:mm:ss
		 * @param t
		 * @return
		 */	
		public static function timeTranslate(t:uint, tH:String = ":", tM:String = ":", tS:String = ""):String{
			var hour:uint;
			var min:uint;
			var sec:uint;
			var time:uint;
			var str:String;
			if(t >= 3600){
				hour = t / 3600;
				time = t % 3600;
			}else{
				hour = 0;
				time = t;
			}
			if(time >= 60){
				min = time / 60;
				sec = time % 60;
			}else{
				sec = time;
			}
			str = "" + hour;
			str = (min < 10) ? (str + tH + "0" + min) : (str + tH + min);
			str = (sec < 10) ? (str + tM + "0" + sec) : (str + tM + sec);
			return (str + tS);
		}
		
		/**
		 *秒转化数组[天，时，分，秒]
		 * @param t
		 * @return
		 */	
		public static function time2Arr(t:Number):Array{
			var day:uint;
			var hour:uint;
			var min:uint;
			var sec:uint;
			var time:uint;
			if(t >= 86400){
				day = t / 86400;
				time = t % 86400;
			}else{
				day = 0;
				time = t;
			}
			if(time >= 3600){
				hour = time / 3600;
				time = time % 3600;
			}else{
				hour = 0;
				time = time;
			}
			if(time >= 60){
				min = time / 60;
				sec = time % 60;
			}else{
				sec = time;
			}
			var tArr:Array = [day, hour, min, sec];
			return tArr;
		}
		
		/**
		 *判断是否是奇数
		 * @param i 判断的数字
		 * @return Boolean
		 * 
		 */	
		public static function isOdd(i:int):Boolean{
			if(i&1)return true;
			return false;
		}
		/**
		 *判断某个数值是否在某个范围内。
		 * @param i 要判断的数值
		 * @param value 范围，字符串，以a-b形式传入，如0-9
		 * @return 
		 * 例：checkContains(6,"0-9")返回true;
		 * checkContains(6,"0-5")返回false
		 * 
		 */		
		public static function checkContains(i:Number,value:String):Boolean{
			var arr:Array=value.split("-");
			if(i>=Number(arr[0])&&i<Number(arr[1])){
				return true;
			}
			return false;
		}
		
		/**
		 *判断数组包含的元素及顺序是否相等
		 * @param arr1：数组1
		 * @param arr2：数组2
		 * @return Boolean
		 * 
		 */	
		public static function equalArr(arr1:Array, arr2:Array):Boolean{
			var length:int = arr1.length;
			if(length != arr2.length){
				return false;
			}
			for(var i:int = 0; i < length; i++){
				if(arr1[i] != arr2[i]){
					return false;
				}
			}
			return true;
		}
		/**
		 *判断某个对象是否是数组中的一个元素 
		 * @param s
		 * @param val
		 * @return 
		 * 
		 */		
		public static function inArray(s:Object,val:Array):Boolean{
			var n:int=val.length;
			for(var i:int=0;i<n;i++){
				if(s==val[i])return true;
			}
			return false;
		}
		/**
		 *复制数组，避免因为对数组进行操作导致原数组一起被修改
		 * @param fromArr 要复制的数组
		 * @return 
		 * 
		 */		
		public static function copyArray(fromArr:Array):Array{
			var res:Array=[];
			var n:int=fromArr.length;
			for(var i:int=0;i<n;i++){
				if(fromArr[i] is Array){
					res.push(copyArray(fromArr[i]));
				}else{
					res.push(fromArr[i]);
				}
			}
			return res;
		}
		/**
		 *将字符串转换为数组 一维数组逗号隔开，二维数组逗号和|隔开
		 * @param str 字符串
		 * @param type 类别，0：一维数组;1：二维数组
		 * @param example 示例：stringToArray("a,b|c,d|e,f|g,h|i,j|k,l")结果为[[a,b],[c,d],[e,f],[g,h],[i,j],[k,l]]
		 * @return 返回得到的数组
		 */		
		public static function stringToArray(str:String,type:int=0):Array{
			var res:Array=[];
			if(!type)return str.split(',');
			res=str.split('|');
			var n:int=res.length;
			for(var i:int=0;i<n;i++){
				res[i]=res[i].split(',');
			}
			return res;
		}
		/**
		 *计算两点前的距离 
		 * @param p0 点1
		 * @param p1 点2
		 * @return 
		 * 
		 */		
		static public  function countAtoB(p0:Point,p1:Point):int{
			return Math.sqrt((p1.x-p0.x)*(p1.x-p0.x)+(p1.y-p0.y)*(p1.y-p0.y));
		}
		/**
		 *位运算取值
		 * 根据指定值返回对应的位基数数组，如getBitValue(34) 返回[32,2]   getBitValue(55) 返回[32,16,4,2,1]  
		 * @param n
		 * @return 返回数组
		 * 
		 */		
		static public function getBitValue(n:int):Array{
			var arr:Array=[];
			arr.push(getn(n));
			while(n>getn(n)){
				n=n-getn(n);
				arr.push(getn(n));
			}
			return arr;
		}
		static private function getn(n:int,r:int=1):int{
			if(r<<1<=n)return getn(n,r<<1);
			return r;
		}
		
		static public function traceByte(byte:ByteArray):String{
			var n:int=byte.length;
			var str:String="";
			for(var i:int=0;i<n;i++){
				str+=byte[i]+" ";
			}
			return str;
		}
	}
}